package com.hulei.studyproject.druid;

import lombok.extern.slf4j.Slf4j;

import java.util.Random;

/**
 * 记录当前数据库，提供切换功能
 * @Title: DynamicDataSourceContextHolder
 * @Description: TODO
 * @author: hulei
 * @date: 2023/8/3 10:16
 * @Version: 1.0
 */
@Slf4j
public class DynamicDataSourceContextHolder {
    /**
     * 使用ThreadLocal维护变量，线程变量隔离
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 设置数据源的变量
     */
    public static void setDataSourceType(String dataSourceType) {
        log.info("切换到{}数据源", dataSourceType);
        CONTEXT_HOLDER.set(dataSourceType);
    }

    public static String getDataSourceType(){
        return CONTEXT_HOLDER.get();
    }

    /**
     * 设置主库
     */
    public static void setMaster() {
        setDataSourceType(DataSourceType.MASTER.name());
    }

    /**
     * 设置从库
     * 采用随机的方式选择(从alpha,beta数据库随机选择，实际应用中可根据项目的负载均衡算法分配)
     */
    public static void setSlave() {
        Random random = new Random();
        if (random.nextInt(2)<1){
            setDataSourceType(DataSourceType.ALPHA.name());
        }else {
            setDataSourceType(DataSourceType.BETA.name());
        }
    }

    /**
     * 清空数据源变量
     */
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }
}
